package com.kaifamiao.schema;

import java.util.Arrays;
import java.util.logging.Logger;
// 注意: 这里导入的是 AspectJ 提供的 JoinPoint
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;

public class PandaAdvice {

    private static final Logger logger = Logger.getAnonymousLogger();

    // 可以通过 JoinPoint 来访问 连接点信息
    public void prepare( JoinPoint jp ) {
        // 获得目标方法签名
        Signature s = jp.getSignature();
        String name = s.getName();
        logger.info( "方法["+ name + "]即将执行" );
    }

    public void before( JoinPoint jp ) {
        String name = jp.getSignature().getName(); // 获得目标方法名称
        Object[] args = jp.getArgs(); // 获得实参
        logger.info( "方法["+ name + "]的实参有" + Arrays.toString( args ) );
    }

    public Object around( ProceedingJoinPoint jp ) throws Throwable {
        String name = jp.getSignature().getName(); // 获得目标方法名称
        logger.info( "开始为[" + name + "]方法计时");
        long begin = System.nanoTime();
        Object result = jp.proceed(); // 通过连接点调用目标方法
        long end = System.nanoTime();
        logger.info( "方法[" + name + "]执行耗时" + ( end - begin ) + "ns." );
        return result;
    }

    public void afterReturn( JoinPoint jp, Object rv ) {
        String name = jp.getSignature().getName(); // 获得目标方法名称
        logger.info( "方法["+ name + "]返回: " + rv );
    }

    public void afterThrow( JoinPoint jp, Throwable th ) {
        String name = jp.getSignature().getName(); // 获得目标方法名称
        logger.info( "方法["+ name + "]抛出: " + th.getClass().getName() );
    }

    public void after( JoinPoint jp ) {
        String name = jp.getSignature().getName();
        logger.info( "方法["+ name + "]执行结束" );
    }

}
